RocketMQ Streams 概述
RocketMQ Streams 是一个基于 RocketMQ 的轻量级流计算引擎。它可以作为 SDK 依赖应用,无需部署复杂的流计算服务器,具有资源高效、易于扩展、流计算算子丰富的特点。
架构
数据由 RocketMQ Streams 从 RocketMQ 消费,经过处理后最终写回到 RocketMQ。
数据由 RocketMQ Consumer 消费,进入处理拓扑图,由算子进行处理。如果流处理任务包含 keyBy 算子,数据需要根据 Key 进行分组并写入 shuffle topic。后续算子从 shuffle topic 消费。如果还存在 count 等有状态算子,计算需要读写 state topic。计算完成后,结果会写回到 RocketMQ。
消费模型
计算实例实际上依赖于 RocketMQ Streams SDK 的客户端。因此,计算实例消费 MQ 依赖于 RocketMQ 的 Rebalance 分配。计算实例的总数不能大于消费 MQ 的总数,否则一些计算实例将处于等待状态,无法消费数据。
一个计算实例可以消费多个 MQ,并且在一个实例内部,只有一个计算拓扑图。
状态
对于有状态的算子,例如 count,必须先进行分组才能求和。分组算子 keyBy 将根据分组键将数据重新写入 RocketMQ,并确保相同键的数据写入同一个分区(此过程称为 shuffle),以保证相同键的数据被同一个消费者消费。状态通过 RocksDB 本地加速,并通过 RocketMQ 远程持久化。
扩容/缩容能力
当计算实例从 3 个减少到 2 个时,在 RocketMQ 集群消费模式下的 Rebalance 功能的帮助下,被消费的 MQ 将在计算实例之间重新分配。Instance1 消费的 MQ2 和 MQ3 被分配给 Instance2 和 Instance3,并且这两个 MQ 的状态数据也需要迁移到 Instance2 和 Instance3。这也意味着状态数据是根据原始数据分区 MQ 保存的;扩容则是一个相反的过程。